import UIKit

//闭包表达式
//嵌套函数是一个在较复杂函数中方便进行命名和定义自包含代码模块的方式

//使用函数作为闭包
    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    func backward(_ s1: String, _ s2: String) -> Bool {
        return s1 > s2
    }
    var reversedNames = names.sorted(by: backward);

//内联闭包，其实就是把普通函数的函数类型也放在{}之间，
    var reversedNamesBlock = names.sorted(by: {(s1: String,s2: String) -> Bool in return s1 > s2});

//根据上下文推断类型
//通过内联闭包表达式构造的闭包作为参数传递给函数或方法时，几乎不需要利用完整格式构造内联闭包
    var reversedNamesBlock1 = names.sorted(by: { s1,s2 in return s1 > s2});

//单表达式闭包隐式返回：单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果
    var reversedNamesBlock2 = names.sorted(by: { s1,s2 in s1 > s2});

//参数名称缩写
//Swift 自动为内联闭包提供了参数名称缩写功能，你可以直接通过 $0，$1，$2 来顺序调用闭包的参数
    reversedNames = names.sorted(by: { $0 > $1 } )

//运算符方法：String 类型定义了关于大于号（>）的字符串实现，其作为一个函数接受两个 String 类型的参数并返回 Bool 类型的值
    reversedNames = names.sorted(by: >)


    reversedNames = names.sorted() { $0 > $1 }//尾随
//尾随闭包（Trailing Closures）
//将一个很长的闭包表达式作为最后一个参数传递给函数，可以使用尾随闭包来增强函数的可读性
    func someFunctionThatTakesAClosure(closure: () -> Bool) {
        print("-1")
        // 函数体部分
    }

    // 以下是不使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure(closure: {
//        ()-> Bool in
        return true
        // 闭包主体部分
    })

    // 以下是使用尾随闭包进行函数调用
    someFunctionThatTakesAClosure() {
        ()-> Bool in
        return false

        // 闭包主体部分
    }

























